#pragma once

#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>

// mode: 运行模式   --true 发布模式   --false 调试模式
// 调试模式, 创建标准输出日志器, 输出等级最低
// 运行模式， 创建文件输出日志器m, 根据参数而定

std::shared_ptr<spdlog::logger> g_default_logger;
void init(bool mode, const std::string &file, int level)
{
    if (mode == false)
    {
        // 创建一个日志类
        g_default_logger = spdlog::stdout_color_mt("default-logger");
        // 对日志类设置
        // 设置默认日志记录器的日志级别为trace，这是最详细的日志级别
        g_default_logger->set_level(spdlog::level::level_enum::trace);

        // 配置日志记录器在记录trace级别及以上的日志时立即刷新缓冲区
        // 这确保所有trace及更高级别的日志消息都会立即写入目标输出
        g_default_logger->flush_on(spdlog::level::level_enum::trace);
    }
    else
    {
        g_default_logger = spdlog::basic_logger_mt("default-logger", file);

        g_default_logger->set_level((spdlog::level::level_enum)level);
        g_default_logger->flush_on((spdlog::level::level_enum)level);
    }
    // 设置日志输出格式
    g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
}
#define LOG_TRACE(format, ...) g_default_logger->trace(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) g_default_logger->debug(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) g_default_logger->info(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) g_default_logger->warn(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) g_default_logger->error(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) g_default_logger->critical(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__)